package com.gold.service;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gold.common.DateUtils;
import com.gold.common.JsonUtils;
import com.gold.common.StringUtils;
import com.gold.dao.UserDao;
import com.gold.entity.CardInfo;
import com.gold.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.Date;
import java.util.List;
import java.util.function.Consumer;

/**
 * @author XiaoHao
 * @date 2022-05-06 11:34
 */
@Service
public class UserService {
    @Autowired
    private UserDao userDao;
    @Autowired
    CardInfoService cardInfoService;

    /**
     * 注册用户校验
     *
     * @param parm
     * @return
     */
    @Transactional
    public String insertVerify(JSONObject parm) {
        try {
            if (parm == null) {
                return JsonUtils.responseJson(false, 400, "用户不能为空", "").toJSONString();
            }
            String username = parm.getString("username");
            if (StringUtils.isEmpty(username)) {
                return JsonUtils.responseJson(false, 400, "用户名不能为空", "").toJSONString();
            }
            User user1 = this.selectName(username);
            if (user1 != null) {
                return JsonUtils.responseJson(false, 400, "用户已存在", "").toJSONString();
            }

            String password = parm.getString("password");
            if (StringUtils.isEmpty(password)) {
                return JsonUtils.responseJson(false, 400, "密码不能为空", "").toJSONString();
            }
            String confirmPassword = parm.getString("confirmPassword");
            if (StringUtils.isEmpty(confirmPassword)) {
                return JsonUtils.responseJson(false, 400, "确认密码不能为空", "").toJSONString();
            }
            if (!password.equals(confirmPassword)) {
                return JsonUtils.responseJson(false, 400, "两次密码不相同", "").toJSONString();
            }

            String cardInfoName = parm.getString("cardInfoName");
            if (StringUtils.isEmpty(cardInfoName)) {
                return JsonUtils.responseJson(false, 400, "卡密不能为空", "").toJSONString();
            }
            CardInfo cardInfo = cardInfoService.selectName(cardInfoName);
            if (cardInfo == null) {
                return JsonUtils.responseJson(false, 400, "卡密不存在", "").toJSONString();
            }
            if ("1".equals(cardInfo.getStatus())) {
                return JsonUtils.responseJson(false, 400, "卡密已使用", "").toJSONString();
            }
            if (cardInfo.getEndTime() != null) {
                if (!DateUtils.compare(cardInfo.getEndTime(), new Date())) {
                    return JsonUtils.responseJson(false, 400, "卡密已过期", "").toJSONString();
                }
            }
            //卡密到期时间
            Date endTime = cardInfo.getEndTime();
            if (endTime == null) {
                //计算卡密到期时间
                Integer days = cardInfo.getDays();
                cardInfo.setEndTime(DateUtils.addDays(new Date(), days));
            }
            //卡密使用时间
            cardInfo.setUseTime(new Date());
            //修改卡密状态 已使用
            cardInfo.setStatus("1");
            User user = new User();
            user.setState("0");
            user.setUsername(username);
            user.setPassword(password);
            user.setCardInfo(cardInfo);
            user.setCreateTime(new Date());
            cardInfoService.update(cardInfo);
            userDao.insertUser(user);
            return JsonUtils.responseJson(true, 200, "注册成功", "").toJSONString();
        } catch (Exception e) {
            e.printStackTrace();
            return JsonUtils.responseJson(false, 500, "系统内部错误，请联系管理员", "").toJSONString();
        }

    }

    /**
     * 用户激活
     * @param parm
     * @return
     */
    public String activeUser(JSONObject parm){
        try {
            if (parm == null) {
                return JsonUtils.responseJson(false, 400, "用户不能为空", "").toJSONString();
            }
            String username = parm.getString("username");
            if (StringUtils.isEmpty(username)) {
                return JsonUtils.responseJson(false, 400, "用户名不能为空", "").toJSONString();
            }
            User user = this.selectName(username);
            if (user == null) {
                return JsonUtils.responseJson(false, 400, "用户不存在", "").toJSONString();
            }
            String cardInfoName = parm.getString("cardInfoName");
            if (StringUtils.isEmpty(cardInfoName)) {
                return JsonUtils.responseJson(false, 400, "卡密不能为空", "").toJSONString();
            }
            CardInfo cardInfo = cardInfoService.selectName(cardInfoName);
            if (cardInfo == null) {
                return JsonUtils.responseJson(false, 400, "卡密不存在", "").toJSONString();
            }
            if ("1".equals(cardInfo.getStatus())) {
                return JsonUtils.responseJson(false, 400, "卡密已使用", "").toJSONString();
            }
            if (cardInfo.getEndTime() != null) {
                if (!DateUtils.compare(cardInfo.getEndTime(), new Date())) {
                    return JsonUtils.responseJson(false, 400, "卡密已过期", "").toJSONString();
                }
            }
            //卡密到期时间
            Date endTime = cardInfo.getEndTime();
            if (endTime == null) {
                //计算卡密到期时间
                Integer days = cardInfo.getDays();
                cardInfo.setEndTime(DateUtils.addDays(new Date(), days));
            }
            user.setState("0");
            user.setCardInfoId(cardInfo.getId()+"");
            //卡密使用时间
            cardInfo.setUseTime(new Date());
            //修改卡密状态 已使用
            cardInfo.setStatus("1");
            cardInfoService.update(cardInfo);
            userDao.updateById(user);
            return JsonUtils.responseJson(true, 200, "激活成功", "").toJSONString();
        } catch (Exception e) {
            e.printStackTrace();
            return JsonUtils.responseJson(false, 500, "系统内部错误，请联系管理员", "").toJSONString();
        }

    }

    /**
     * 查询用户的卡密信息
     *
     * @param user
     * @return
     */
    public User getUserCardId(User user) {
        return userDao.getUserCardId(user);
    }

    /**
     * 分页查询
     *
     * @param page
     * @param size
     * @param user
     * @return
     */
    public IPage<User> selectAll(Integer page, Integer size, User user) {
        QueryWrapper<User> qw = new QueryWrapper<>();
        if (user != null) {
            if (StringUtils.isNotEmpty(user.getUsername())) {
                qw.like("username", user.getUsername());
            }
            if (StringUtils.isNotEmpty(user.getState())) {
                qw.eq("state", user.getState());
            }
        }
        Page<User> page1 = new Page<>(page, size);
        IPage<User> userIPage = userDao.selectPage(page1, qw);
        if (userIPage!=null){
            List<User> records = userIPage.getRecords();
            if (records!=null){
                records.forEach(user1 -> {user1.setCardInfo(cardInfoService.selectId(user1.getCardInfoId())); });
            }
        }
        return userIPage;
    }

    public User selectOne(String id) {
        return userDao.selectById(id);
    }

    /**
     * 通过名称查询
     *
     * @param name
     * @return
     */
    public User selectName(String name) {
        QueryWrapper<User> qw = new QueryWrapper<>();
        qw.eq("username", name);
        return userDao.selectOne(qw);
    }

    /**
     * 更新
     *
     * @param user
     */
    public void update(User user) {
        userDao.updateById(user);
    }

    public void delete(User user){
        userDao.deleteById(user.getId());
    }


    /**
     * 更新用户和微信绑定
     * @param user
     */
    public void updateWechat(User user){
        userDao.updateWechat(user);
    }

}
